package com.example.lib_mvp.views;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;

import androidx.core.content.ContextCompat;

import com.example.lib_mvp.R;

import java.util.Random;

/**
 * 自定义的音频模拟条形图
 */
public class MyAF extends View {
    // 音频矩形的数量
    private int mRectCount;
    // 音频矩形的画笔
    private Paint mRectPaint;
    // 渐变颜色的两种
    private int topColor, downColor;
    // 音频矩形的宽和高
    private int mRectWidth, mRectHeight;
    // 偏移量
    private int offset;
    // 频率速度
    private int mSpeed;
    // 是否正在播放
    private boolean isplay;

    // 是否 需要默认数据值展示
    private boolean isDefaultData = false;
    // 随机数生成器
    private Random random;
    // 记录每个矩形的高度
    private float[] rectHeights;

    public MyAF(Context context) {
        super(context);
        init(context, null);
    }

    public MyAF(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public MyAF(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        random = new Random();
        mRectPaint = new Paint();
        mRectPaint.setAntiAlias(true);

        if (attrs != null) {
            TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyAF);
            // 添加矩形画笔的基础颜色
            mRectPaint.setColor(ta.getColor(R.styleable.MyAF_AFTopColor,
                    ContextCompat.getColor(context, R.color.orange)));
            // 添加矩形渐变色的上面部分
            topColor = ta.getColor(R.styleable.MyAF_AFTopColor,
                    ContextCompat.getColor(context, R.color.orange));
            // 添加矩形渐变色的下面部分
            downColor = ta.getColor(R.styleable.MyAF_AFDownColor,
                    ContextCompat.getColor(context, R.color.green_value));
            // 设置矩形的数量
            mRectCount = ta.getInt(R.styleable.MyAF_AFCount, 30);
            // 设置重绘的时间间隔，也就是变化速度
            mSpeed = ta.getInt(R.styleable.MyAF_AFSpeed, 100);
            // 每个矩形的间隔
            offset = ta.getInt(R.styleable.MyAF_AFOffset, 5);
            ta.recycle();
        } else {
            // 默认值
            mRectPaint.setColor(ContextCompat.getColor(context, R.color.orange));
            topColor = ContextCompat.getColor(context, R.color.orange);
            downColor = ContextCompat.getColor(context, R.color.green_value);
            mRectCount = 30;
            mSpeed = 100;
            offset = 5;
        }

        // 初始化rectHeights数组并设置随机高度
        rectHeights = new float[mRectCount];
        for (int i = 0; i < mRectCount; i++) {
            rectHeights[i] = (float) (mRectHeight * random.nextDouble());
        }
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldW, int oldH) {
        super.onSizeChanged(w, h, oldW, oldH);
        // 渐变效果
        LinearGradient mLinearGradient;
        // 画布的宽
        int mWidth;
        // 获取画布的宽
        mWidth = getWidth();
        // 获取矩形的最大高度
        mRectHeight = getHeight();
        // 获取单个矩形的宽度(减去的部分为到右边界的间距)
        mRectWidth = (mWidth - offset) / mRectCount;
        // 实例化一个线性渐变
        mLinearGradient = new LinearGradient(
                0,
                0,
                mRectWidth,
                mRectHeight,
                topColor,
                downColor,
                Shader.TileMode.CLAMP
        );
        // 添加进画笔的着色器
        mRectPaint.setShader(mLinearGradient);

        // 重新初始化rectHeights数组并设置随机高度
        for (int i = 0; i < mRectCount; i++) {
            rectHeights[i] = (float) (mRectHeight * random.nextDouble());
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (!isplay) {
            // 如果isDefaultData为 true，使用之前记录的高度进行绘制
            if (isDefaultData) {
                drawRectanglesWithSavedHeights(canvas);
            }
            return;
        }

        // 更新每个矩形的高度
        for (int i = 0; i < mRectCount; i++) {
            rectHeights[i] = (float) (mRectHeight * random.nextDouble());
        }

        // 绘制矩形
        drawRectanglesWithSavedHeights(canvas);

        // 使得view延迟重绘
        postInvalidateDelayed(mSpeed);
    }

    private void drawRectanglesWithSavedHeights(Canvas canvas) {
        for (int i = 0; i < mRectCount; i++) {
            float currentHeight = rectHeights[i];

            // 矩形的绘制是从左边开始到上、右、下边（左右边距离左边画布边界的距离，上下边距离上边画布边界的距离）
            canvas.drawRect(
                    (float) (mRectWidth * i + offset),
                    currentHeight,
                    (float) (mRectWidth * (i + 1)),
                    mRectHeight,
                    mRectPaint
            );
        }
    }

    public void setIsplay(boolean isplay) {
        this.isplay = isplay;
        if (isplay) {
            // 如果isplay为true，立即开始绘制
            invalidate();
        } else {
            // 如果isplay为false，停止绘制
            // 不需要做额外操作，因为onDraw中已经检查了isplay状态
        }
    }

    public void setDefaultData(boolean defaultData) {
        isDefaultData = defaultData;
        invalidate();
    }
}
